#include "BlockQueue.hpp"
#include "Task.hpp"
#include <unistd.h>
using namespace BlockQueueModule;
using namespace TaskModule;


// 生产
void *production(void *age)
{
	BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(age);
	while (true)
	{
		int a = rand()%10 + 1; // 1-10
		int b = rand()%20 + 1; // 1-20
		Task data(a,b);
		// sleep(2);
		bq->Equeue(data);
        printf("producter 生产了一个数据: %d+%d = ?\n", data.A(),data.B());
	}
	return nullptr;
}

// 消费
void *consume(void *age)
{
	BlockQueue<Task> *bq = static_cast<BlockQueue<Task> *>(age);
	while (true)
	{
		sleep(2);
		Task data;
		// 1. 从bq拿到数据
		bq->Pop(&data);
		// 2.做处理
		data.Excute();
		printf("Consumer, 消费了一个数据: %d\n", data.RE());
	}
	return nullptr;
}

int main()
{
	srand(time(nullptr) ^ getpid());
	// pthread_t p1,p2,p3, c1,c2;
	pthread_t p1,c1;
	BlockQueue<Task> *bq = new BlockQueue<Task>(5);
	pthread_create(&p1, nullptr, production, bq);
	pthread_create(&c1, nullptr, consume, bq);

	pthread_join(p1, nullptr);
	pthread_join(c1, nullptr);
	return 0;
}




// ----------------------------------------------------------------- 给生产消费模型传int
// // 生产
// void *production(void *age)
// {
// 	BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(age);
// 	int data = 10;
// 	while (true)
// 	{
// 		// sleep(2);
// 		bq->Equeue(data);
//         printf("producter 生产了一个数据: %d\n", data);
//         data++;
// 	}
// 	return nullptr;
// }

// // 消费
// void *consume(void *age)
// {
// 	BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(age);
// 	while (true)
// 	{
// 		sleep(2);
// 		int data;
// 		// 1. 从bq拿到数据
// 		bq->Pop(&data);
// 		// 2.做处理
// 		printf("Consumer, 消费了一个数据: %d\n", data);
// 	}
// 	return nullptr;
// }

// int main()
// {
// 	// pthread_t p1,p2,p3, c1,c2;
// 	pthread_t p1,c1;
// 	BlockQueue<int> *bq = new BlockQueue<int>(5);
// 	pthread_create(&p1, nullptr, production, bq);
// 	// pthread_create(&p2, nullptr, production, bq);
// 	// pthread_create(&p3, nullptr, production, bq);
// 	pthread_create(&c1, nullptr, consume, bq);
// 	// pthread_create(&c2, nullptr, consume, bq);

// 	pthread_join(p1, nullptr);
// 	pthread_join(c1, nullptr);
// 	return 0;
// }